// 版权归Go作者所有。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// go:构建msan 

package runtime

import (
	"unsafe"
)

// /公共内存消毒器API。

func MSanRead(addr unsafe.Pointer, len int) {
	msanread(addr, uintptr(len))
}

func MSanWrite(addr unsafe.Pointer, len int) {
	msanwrite(addr, uintptr(len))
}

// 运行时的专用接口。
const msanenabled = true

// 如果我们在系统堆栈上运行，C程序可能会将该堆栈的一部分标记为未初始化。我们不在运行时为
// 插入指令，但像切片拷贝这样的操作可以调用msanread 
// 以获取堆栈上的值。在系统堆栈上运行
// 时，只需忽略msanread。其他msan功能正常。go:noescape-
func msanread(addr unsafe.Pointer, sz uintptr) {
	g := getg()
	if g == nil || g.m == nil || g == g.m.g0 || g == g.m.gsignal {
		return
	}
	domsanread(addr, sz)
}

func domsanread(addr unsafe.Pointer, sz uintptr)

// go:noescape-
func msanwrite(addr unsafe.Pointer, sz uintptr)

// go:noescape-
func msanmalloc(addr unsafe.Pointer, sz uintptr)

// go:noescape-
func msanfree(addr unsafe.Pointer, sz uintptr)

// go:noescape-
func msanmove(dst, src unsafe.Pointer, sz uintptr)

// 。s 
// go:cgo_import_static uu msan u read u go 
// go:cgo_import_static uu write_ugo 
// go cgo_import_static u malloc go 
// go cgo_import_static u free U go 61
